﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace AppManagement.UsersManager
{
    #region Using
    using DevComponents.DotNetBar;
    using AppManagement.Models;
    using AppManagement.Repositories;
    using AppManagement.Helpers;
    using AppManagement.MainManagers;
    #endregion

    /// <summary>
    ///  manage users in DB
    /// </summary>
    public partial class FrmQuanLyNGUOIDUNG : DevComponents.DotNetBar.Office2007Form
    {
        // Using this variable to get which ma loai nguoi dung is specified
        private int SpecifiedMaLoaiNguoiDung = -1;
        private string SpecifiedTenLoaiNguoiDung = string.Empty;
        private int SpecifiedMaNguoiDung = -1;
        private DevComponents.DotNetBar.Controls.TextBoxX txtCHINHANH_ID;

        public FrmQuanLyNGUOIDUNG()
        {
            InitializeComponent();
        }

        private void FrmQuanLyNGUOIDUNG_Load(object sender, EventArgs e)
        {
            InitHiddenFields();
            LoadLoaiNguoiDung();
            LoadChucNang();
            LoadNguoiDung();
            txtNgayDangKi.Text = String.Format("{0:dd/MM/yyyy}", DateTime.Now);
        }

        private void btnDongNSD_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void lstvNhomNguoiDung_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Checked)
            {
                for (int i = 0; i < lstvNhomNguoiDung.Items.Count; i++)
                {
                    if (i != e.Index)
                    {
                        lstvNhomNguoiDung.Items[i].Checked = false;
                    }
                    else
                    {
                        SpecifiedMaLoaiNguoiDung = (int)lstvNhomNguoiDung.Items[e.Index].Tag;
                        SpecifiedTenLoaiNguoiDung = lstvNhomNguoiDung.Items[e.Index].Text;
                        ResetStateOfChucNang();
                        LoadChucNangBelongToNguoiDung(SpecifiedMaLoaiNguoiDung);
                        if (SpecifiedTenLoaiNguoiDung.ToUpper().Contains("NHÂN VIÊN CHI NHÁNH"))
                        {
                            btnChonCHINHANH.Enabled = true;
                        }
                        else
                        {
                            btnChonCHINHANH.Enabled = false;
                        }
                    }
                }
            }
        }

        private void lstbxNguoiDung_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstbxNguoiDung.SelectedIndex != -1)
            {
                try
                {
                    var nguoidung = (NGUOIDUNG)lstbxNguoiDung.SelectedItem;
                    txtTenDangNhap.Text = nguoidung.TEN_DANG_NHAP;
                    txtMatKhau.Text = Encryption.Decrypt(nguoidung.MATKHAU);
                    txtNgayDangKi.Text = nguoidung.NGAY_DANG_KY == null ? String.Format("{0:dd/MM/yyyy}", DateTime.Now) : String.Format("{0:dd/MM/yyyy}", nguoidung.NGAY_DANG_KY.Value);
                    txtMoTa.Text = nguoidung.MOTA;
                    SpecifiedMaNguoiDung = nguoidung.NGUOIDUNG_ID;
                    txtTenNguoiDung.Text = nguoidung.TEN_NGUOI_DUNG;
                    txtDienThoai.Text = nguoidung.DIEN_THOAI;
                    SpecifiedTenLoaiNguoiDung = nguoidung.LOAINGUOIDUNG.TEN_LOAI_NGUOI_DUNG;
                    if (SpecifiedTenLoaiNguoiDung.ToUpper().Contains("NHÂN VIÊN CHI NHÁNH"))
                    {
                        txtCHINHANH_ID.Text = NHANVIEN_CHINHANHRepository.SelectByNHAN_VIEN_ID(nguoidung.NGUOIDUNG_ID).CHI_NHANH_ID.ToString();
                        txtCHINHANH.Text = NHANVIEN_CHINHANHRepository.SelectByNHAN_VIEN_ID(nguoidung.NGUOIDUNG_ID).CHINHANH.TEN_CHI_NHANH;
                    }
                    else
                    {
                        txtCHINHANH_ID.Text = string.Empty;
                        txtCHINHANH.Text = string.Empty;
                    }
                    for (int i = 0; i < lstvNhomNguoiDung.Items.Count; i++)
                    {
                        if (nguoidung.LOAI_NGUOI_DUNG_ID == (int)lstvNhomNguoiDung.Items[i].Tag)
                        {
                            lstvNhomNguoiDung.Items[i].Checked = true;
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message, ex.InnerException);
                }
            }
        }

        private void btnNhapMoi_Click(object sender, EventArgs e)
        {
            txtTenDangNhap.Text = "";
            txtMatKhau.Text = "";
            txtMoTa.Text = "";
            txtNgayDangKi.Text = String.Format("{0:dd/MM/yyyy}", DateTime.Now);
            txtCHINHANH_ID.Text = "";
            txtCHINHANH.Text = "";
            txtTenNguoiDung.Text = "";
            txtDienThoai.Text = "";

            ResetStateOfLoaiNguoiDung();
            ResetStateOfChucNang();
        }

        private void btnThemNSD_Click(object sender, EventArgs e)
        {
            var errorText = "";
            if (!ValidateInput(EnumUpdateMode.INSERT, ref errorText))
            {
                MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (ActionAdd())
            {
                if (NGUOIDUNGRepository.SelectAll().Count == 1)
                {
                    MessageBoxEx.Show("Ngưởi dùng đầu tiên đã được tạo.\nChương trình sẽ tự động thoát để xác lập cấu hình hệ thống!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Application.Exit();
                }
                else
                {
                    MessageBoxEx.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LoadNguoiDung();
                }
            }
            else
            {
                MessageBoxEx.Show("Lưu dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnXoaNSD_Click(object sender, EventArgs e)
        {
            var errorText = "";
            if (!ValidateInput(EnumUpdateMode.DELETE, ref errorText))
            {
                MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (MessageBoxEx.Show("Bạn có chắc chắn xóa dòng này không?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (ActionDelete())
                {
                    MessageBoxEx.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LoadNguoiDung();
                    btnNhapMoi_Click(sender, e);
                }
                else
                {
                    MessageBoxEx.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btnGhiNSD_Click(object sender, EventArgs e)
        {
            var errorText = "";
            if (!ValidateInput(EnumUpdateMode.UPDATE, ref errorText))
            {
                MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (ActionUpdate())
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                LoadNguoiDung();
                ReChoosingNguoiDung(SpecifiedMaNguoiDung);
            }
            else
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Load list of nguoi dung exist in DB
        /// </summary>
        public void LoadNguoiDung()
        {
            try
            {
                var lstItem = NGUOIDUNGRepository.SelectAll();
                lstbxNguoiDung.Items.Clear();
                for (int i = 0; i < lstItem.Count; i++)
                {
                    // Only add another nguoi dung, not me ()
                    if (lstItem[i].TEN_DANG_NHAP != GlobalVariables.g_CurrentUser.TEN_DANG_NHAP)
                    {
                        lstbxNguoiDung.Items.Add(lstItem[i]);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex.InnerException);
            }
        }

        /// <summary>
        /// Reset check state of list all of chuc nang loaded in list view
        /// </summary>
        public void ResetStateOfChucNang()
        {
            for (int i = 0; i < lstvChucNangDuocSuDung.Items.Count; i++)
            {
                lstvChucNangDuocSuDung.Items[i].Checked = false;
            }
        }

        /// <summary>
        /// Reset check state of list all of loai nguoi dung loaded in list view
        /// </summary>
        public void ResetStateOfLoaiNguoiDung()
        {
            for (int i = 0; i < lstvNhomNguoiDung.Items.Count; i++)
            {
                lstvNhomNguoiDung.Items[i].Checked = false;
            }
        }

        /// <summary>
        /// Load list of chuc nang belong to specified loai nguoi dung
        /// </summary>
        public void LoadChucNangBelongToNguoiDung(int maloainguoidung)
        {
            try
            {
                var lstItem = CHUCNANG_LOAINGUOIDUNGRepository.SelectByMaLoaiNguoiDung(maloainguoidung);
                // Loop for obtained list of chuc nang
                for (int i = 0; i < lstItem.Count; i++)
                {
                    // Loop for obtained list all of chuc nang, if which item have ma chuc nang equal specified chuc nang
                    // => Set check state is checked
                    for (int j = 0; j < lstvChucNangDuocSuDung.Items.Count; j++)
                    {
                        if ((int)lstvChucNangDuocSuDung.Items[j].Tag == lstItem[i].CHUCNANG_ID)
                        {
                            lstvChucNangDuocSuDung.Items[j].Checked = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex.InnerException);
            }
        }

        /// <summary>
        /// Load list all of loai nguoi dung exist in DB
        /// </summary>
        public void LoadLoaiNguoiDung()
        {
            try
            {
                var lstItem = LOAINGUOIDUNGRepository.SelectAll();
                if (lstItem.Count > 0)
                {
                    ListViewItem objListViewItem;
                    lstvNhomNguoiDung.Items.Clear();
                    for (int i = 0; i < lstItem.Count; i++)
                    {
                        objListViewItem = new ListViewItem();
                        objListViewItem.Tag = lstItem[i].LOAI_NGUOI_DUNG_ID;
                        objListViewItem.Text = lstItem[i].TEN_LOAI_NGUOI_DUNG;
                        objListViewItem.ImageIndex = 0;
                        lstvNhomNguoiDung.Items.Add(objListViewItem);
                    }
                }
            }
            catch (System.Exception e)
            {
                throw new Exception(e.Message, e.InnerException);
            }
        }

        /// <summary>
        /// Load list all of chuc nang exist in DB
        /// </summary>
        public void LoadChucNang()
        {
            try
            {
                var lstItem = CHUCNANGRepository.SelectAll();
                if (lstItem.Count > 0)
                {
                    ListViewItem objListViewItem;
                    lstvChucNangDuocSuDung.Items.Clear();
                    for (int i = 0; i < lstItem.Count; i++)
                    {
                        objListViewItem = new ListViewItem();
                        objListViewItem.Tag = lstItem[i].CHUCNANG_ID;
                        objListViewItem.SubItems.Add(lstItem[i].TEN_CHUC_NANG);
                        lstvChucNangDuocSuDung.Items.Add(objListViewItem);
                    }
                }
            }
            catch (System.Exception e)
            {
                throw new Exception(e.Message, e.InnerException);
            }
        }

        /// <summary>
        /// Validate user input
        /// </summary>
        /// <param name="isUpdate"></param>
        /// <returns></returns>
        private bool ValidateInput(EnumUpdateMode mode, ref string errorText)
        {
            // Mode update -> checking MaChucNang is exists on textbox
            if (mode == EnumUpdateMode.UPDATE || mode == EnumUpdateMode.DELETE)
            {
                if (SpecifiedMaNguoiDung == -1)
                {
                    errorText = "Vui lòng chọn người dùng";
                    return false;
                }
            }
            if (mode != EnumUpdateMode.DELETE)
            {
                if (txtTenDangNhap.Text == "")
                {
                    errorText = "Vui lòng nhập tên đăng nhập ";
                    return false;
                }

                if (txtMatKhau.Text == "")
                {
                    errorText = "Vui lòng nhập mật khẩu ";
                    return false;
                }

                if (SpecifiedMaLoaiNguoiDung == -1)
                {
                    errorText = "Vui lòng chọn loại người dùng";
                    return false;
                }

                if (txtTenNguoiDung.Text == "")
                {
                    errorText = "Vui lòng nhập tên người dùng";
                    return false;
                }

                if (SpecifiedTenLoaiNguoiDung.ToUpper().Contains("NHÂN VIÊN CHI NHÁNH"))
                {
                    if (txtCHINHANH_ID.Text == string.Empty)
                    {
                        errorText = "Vui lòng chọn chi nhánh";
                        return false;
                    }
                }
            }
            return true;
        }

        /// <summary>
        /// Add a new item to DB
        /// </summary>
        /// <returns></returns>
        private bool ActionAdd()
        {
            try
            {
                var item = new NGUOIDUNG
                {
                    LOAI_NGUOI_DUNG_ID = SpecifiedMaLoaiNguoiDung,
                    TEN_DANG_NHAP = txtTenDangNhap.Text.Trim(),
                    MATKHAU = Encryption.Encrypt(txtMatKhau.Text.Trim()),
                    MOTA = txtMoTa.Text,
                    NGAY_DANG_KY = DateTime.Now,
                    TEN_NGUOI_DUNG = txtTenNguoiDung.Text,
                    DIEN_THOAI = txtDienThoai.Text
                };
                if (!NGUOIDUNGRepository.Insert(item))
                {
                    return false;
                }
                if (SpecifiedTenLoaiNguoiDung.ToUpper().Contains("NHÂN VIÊN CHI NHÁNH"))
                {
                    var nvcn = new NHANVIEN_CHINHANH
                    {
                        NHAN_VIEN_ID = item.NGUOIDUNG_ID,
                        CHI_NHANH_ID = int.Parse(txtCHINHANH_ID.Text)
                    };
                    if (!NHANVIEN_CHINHANHRepository.Insert(nvcn))
                    {
                        return false;
                    }
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Update item with specificed ID
        /// </summary>
        /// <returns></returns>
        private bool ActionUpdate()
        {
            try
            {
                var item = NGUOIDUNGRepository.SelectByID(SpecifiedMaNguoiDung);
                item.LOAI_NGUOI_DUNG_ID = SpecifiedMaLoaiNguoiDung;
                item.TEN_DANG_NHAP = txtTenDangNhap.Text.Trim();
                item.MATKHAU = Encryption.Encrypt(txtMatKhau.Text.Trim());
                item.MOTA = txtMoTa.Text.Trim();
                item.TEN_NGUOI_DUNG = txtTenNguoiDung.Text.Trim();
                item.DIEN_THOAI = txtDienThoai.Text.Trim();
                var result = false;
                if (!string.Empty.Equals(txtCHINHANH_ID.Text))
                {
                    var nvcn = NHANVIEN_CHINHANHRepository.SelectByNHAN_VIEN_ID(SpecifiedMaNguoiDung);
                    nvcn.CHI_NHANH_ID = int.Parse(txtCHINHANH_ID.Text.Trim());
                    result = NHANVIEN_CHINHANHRepository.Save();
                    if (!result)
                    {
                        return false;
                    }
                }
                return CHUCNANGRepository.Save();
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Delete item with specified ID
        /// </summary>
        /// <returns></returns>
        private bool ActionDelete()
        {
            try
            {
                return NGUOIDUNGRepository.Delete(SpecifiedMaNguoiDung);
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// After user was updated, re-choosing that user in listbox nguoi dung
        /// </summary>
        /// <param name="manguoidung"></param>
        public void ReChoosingNguoiDung(int manguoidung)
        {
            for (int i = 0; i < lstbxNguoiDung.Items.Count; i++)
            {
                if (((NGUOIDUNG)lstbxNguoiDung.Items[i]).NGUOIDUNG_ID == manguoidung)
                {
                    lstbxNguoiDung.SetSelected(i, true);
                }
            }
        }

        public void InitHiddenFields()
        {
            txtCHINHANH_ID = new DevComponents.DotNetBar.Controls.TextBoxX
            {
                Name = "txtCHINHANH_ID",
                Text = ""
            };
            txtCHINHANH_ID.Visible = false;
        }

        private void btnChonCHINHANH_Click(object sender, EventArgs e)
        {
            FrmQuanLyCHINHANH frm = new FrmQuanLyCHINHANH(true);
            frm.Handler += GetCHINHANH;
            frm.ShowDialog();
        }

        public void GetCHINHANH(object sender, EventArgs e)
        {
            var eventType = (TransferSimpleDataEvent)e;
            string[] comp = eventType.Data.Split(new char[] { '#' });
            txtCHINHANH_ID.Text = comp[0];
            txtCHINHANH.Text = comp[1];
        }

        private void lstvNhomNguoiDung_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}